package com.demo.singleton;

/**
 * @Author likz
 * @Date 2025/7/23 16:50
 * @Description
 *      单例模式 一般理解为静态类 运行加载一次
 *      常用的ThreadLocal
 **/
public class LazySingle {

    public LazySingle(){};



    //  静态变量创建类的对象 在成员位置创建该类的对象
//    private static LazySingle instance = new LazySingle();
//
//    //对外提供静态方法获取该对象
//    public static LazySingle getInstanceOne() {
//        return instance;
//    }

    private static LazySingle lazySingle;

    // 静态变量创建类的对象 方式
//    static {
//        lazySingle = new LazySingle();
//    }
//    public static LazySingle getInstance(){
//        return lazySingle;
//    }

    // 懒汉式 线程不安全
//    public static LazySingle getInstance(){
//        if(lazySingle == null){
//            lazySingle = new LazySingle();
//        }
//        return lazySingle;
//    }

    // 饿汉 线程安全
    public static synchronized LazySingle getInstance(){
        if(lazySingle==null){
            lazySingle=new LazySingle();
        }
        return lazySingle;
    }

    // 双重判定
    public static LazySingle getInstances(){
        if(lazySingle == null){
            synchronized (LazySingle.class){
                if(lazySingle == null){
                    lazySingle = new LazySingle();
                }
            }
        }
        return lazySingle;
    }
    // 双重判定 容易出现空指针 使用 volatile
    private static volatile LazySingle lazySingles;

    public static LazySingle getVolatileInstance(){
        if(lazySingles == null){
            synchronized (LazySingle.class){
                if(lazySingles == null){
                    lazySingles = new LazySingle();
                }
            }
        }
        return lazySingles;
    }
    // 静态内部类 解决多线程情况下加锁性能问题
    private static class LazySingleHolder{
        private static final LazySingle INSTANCE = new LazySingle();
    }
    public static LazySingle getInstanceByHolder(){
        return LazySingleHolder.INSTANCE;
    }

    // 反射情况下 会创建多个实例
//    private LazySingle(String  name){
//        if(LazySingle.lazySingle != null){
//            throw new RuntimeException("单例构造器禁止反射调用");
//        }
//    }
//
//    private static class LazySingleHolder{
//        private static final LazySingle INSTANCE = new LazySingle();
//    }
//    public  LazySingle getInstanceByHolder(){
//        return LazySingleHolder.INSTANCE;
//    }
    // 序列话情况下也会出错 使用readResolve 解决


}
